package com.bit.cfdi.web.domain;


import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

	private static final long serialVersionUID = 1L;
	// Fields

	private Long idCliente;
	private String claveCliente;
	private DatosFiscales datosFiscales;
	private Negocio negocio;
	private Persona persona;
	private Direccion direccionEnvio;
	private Long ultimaModificacionPor;
	private Calendar fechaModificacion;
	private Integer status;
	private Set<Comprobante> comprobantes = new HashSet<Comprobante>(0);
	
	public static final String ONE_DAY_STRING = "1d";
	public static final String ONE_WEEK_STRING = "1s";
	public static final String FIFTEEN_DAYS_STRING = "1q";
	public static final String ONE_MONTH_STRING = "1m";
	public static final String THREE_MONTHS_STRING = "3m";
	public static final String SIX_MONTHS_STRING = "6m";
	public static final String ONE_YEAR_STRING = "1a";
	
	/*
	private Set<ValorCampoExtraCliente> valoresCamposExtraCliente = 
		new HashSet<ValorCampoExtraCliente>(0);*/

	// Property accessors
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id_cliente", nullable = false)
	public Long getIdCliente() {
		return this.idCliente;
	}

	public void setIdCliente(Long idCliente) {
		this.idCliente = idCliente;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_datos_fiscales")
	public DatosFiscales getDatosFiscales() {
		return this.datosFiscales;
	}

	public void setDatosFiscales(DatosFiscales datosFiscales) {
		this.datosFiscales = datosFiscales;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_negocio")
	public Negocio getNegocio() {
		return this.negocio;
	}

	public void setNegocio(Negocio negocio) {
		this.negocio = negocio;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_persona")
	public Persona getPersona() {
		return this.persona;
	}

	public void setPersona(Persona persona) {
		this.persona = persona;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_direccion_envio")
	public Direccion getDireccionEnvio() {
		return this.direccionEnvio;
	}

	public void setDireccionEnvio(Direccion direccionEnvio) {
		this.direccionEnvio = direccionEnvio;
	}
	
	@Column(name = "ultima_modificacion_por")
	public Long getUltimaModificacionPor() {
		return this.ultimaModificacionPor;
	}

	public void setUltimaModificacionPor(Long ultimaModificacionPor) {
		this.ultimaModificacionPor = ultimaModificacionPor;
	}

	@Column(name = "fecha_modificacion")
	@Temporal(TemporalType.TIMESTAMP)
	@Version
	public Calendar getFechaModificacion() {
		return this.fechaModificacion;
	}

	public void setFechaModificacion(Calendar fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}
	
	@Column(name = "status")
	public Integer getStatus() {
		return this.status;
	}
	
	public void setStatus(Integer status) {
		this.status = status;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente")
	public Set<Comprobante> getComprobantes() {
		return this.comprobantes;
	}

	public void setComprobantes(Set<Comprobante> comprobantes) {
		this.comprobantes = comprobantes;
	}
/*
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente")
	public Set<ValorCampoExtraCliente> getValoresCamposExtraCliente() {
		return this.valoresCamposExtraCliente;
	}

	public void setValoresCamposExtraCliente(
			Set<ValorCampoExtraCliente> valoresCamposExtraCliente) {
		this.valoresCamposExtraCliente = valoresCamposExtraCliente;
	}*/

	@Column(name = "clave_cliente")
	public String getClaveCliente() {
		return claveCliente;
	}

	public void setClaveCliente(String claveCliente) {
		this.claveCliente = claveCliente;
	}
	
}